#ifndef _SECTOR
#define _SECTOR

#include "sectorGate.h"
#include "player.h"
#include "TableauDynamiqueLaser.h"


#define numberSpaceShip 8 /* definition de constante utilisable en tant que taille de tableau */
#define numberFactory 5

#define SIZEX 800
#define SIZEY 600

typedef struct{
    int sizeX,
        sizeY,
        nbSpaceShip,
        nbFactory,
        numSector;

    spaceShip* tabSpaceShip[numberSpaceShip];
    factory* tabFactory[numberFactory];

    TableauDynamiqueLaser* tabLaserSector;

    char grid[20][20];
    //SDL_Rect** hotSpot; /*pour le debug*/

    sectorGate* tabGate[4];
}sector;

typedef struct{
    int boolExplosion; /* 0 si il n'y a pas d'explosion, 1 si il y en a une */
    int posX;
    int posY;
    int etape;
}explosion;

sector* createSector();/*créer un secteur*/

void initSector(sector* sct, int numSector);/*initialise le secteur*/

void freeSector(sector* sct);/*free le secteur*/

void freeSectorTDLaser(sector* sct);/*free le tableau dynamique de laser*/

void initSpaceShipSector(sector* sct, spaceShip* BDD_spaceShip, int numSector);/*initialise les vaisseaux du secteur*/

void freeSpaceShipSector(sector* sct);/*free les vaisseaux du secteur*/

void initFactorySector(sector* sct, freight* tabFreight, spaceShip* tabSpaceShip);/*initialise les factories du secteur*/

void freeFactorySector(sector* sct);/*free les factories du secteur*/

int isSpaceShip(sector* sct,player* p, int posX, int posY); /*retourne 1 si la case posX posY de sct contient un spaceShip,
                                                               retourne 2 si la case posX posY de sct contient un spaceShip détenu par le joueur
                                                               retourne 0 sinon*/

void showSectorInfo(sector sct);/*affiche les informations du secteur*/

void SDL_ShowSector(SDL_Surface* screen, sector sct, player p, int boolBars, SDL_Surface* playerShip, SDL_Surface* friendShip, SDL_Surface* sectorFactory, SDL_Surface* sectorShip, SDL_Surface* pirateShip, SDL_Surface* target, SDL_Surface* gate, SDL_Surface* background); /* affiche le secteur */

void showGrid(sector sct);/*affiche la grille (texte)*/

void SDL_ShowGrid(SDL_Surface* screen, sector sct);/*affiche la grille (SDL)*/

void changeGrid(sector* sct, player p); /* change le secteur */

char caseContent(sector sct, int x, int y);/*contenu d'une case(texte)*/

factory* returnFactory(sector sct, int x, int y);/*renvoie la factory à la position x,y*/

spaceShip* returnPlayerSpaceShip(player p, int x, int y);/*renvoie le vaisseau à la position x,y*/

void hotSpotSector(sector* sct, SDL_Surface* screen);/*affiche les zones de danger autour des vaisseaux (non fonctionnel)*/

void sectorIA(sector* sct, player p, SDL_Surface* screen);/*gère l'entière totalité absolue des IA dans un secteur donné*/

void collisionGlobal(sector* sct, player* p, explosion* explLaser);/*gère les collisions entre vaisseaux IA*/

void updateSectorLaser(sector* sct);/*met à jour la position des lasers dans le secteur*/

void printSectorLaser(SDL_Surface* screen, SDL_Surface* laserImg, sector sct);/*affiche les lasers du secteur*/

void regenShieldSpaceShipSector(sector* sct);/*régénère les boucliers des vaisseaux du secteur*/

void destroySpaceShipSector(sector* sct, player* p, explosion* expl);/*détruit les vaisseaux du secteur*/

void printExplosionSpaceShip(SDL_Surface* screen, explosion* expl);/*affiche une animation d'explosion*/

void printExplosionLaser(SDL_Surface* screen, explosion* explLaser);/*affiche une animation d'explosion*/

void starGate(SDL_Surface* screen, SDL_Surface* gate, spaceShip* s, sector** tabSector,  freight* BDD_freight, spaceShip* BDD_spaceShip);/*gère les portes de secteur*/

void updateMission(player* p, sector* sct);/*met à jour les missions*/

#endif
